package com.fudan.backend.service;

import com.fudan.backend.exception.BaseException;
import com.fudan.backend.exception.RetCode;
import com.fudan.backend.pojo.Order;
import com.fudan.backend.pojo.util.StoreMoreInfo;
import com.fudan.backend.pojo.vo.CommodityInfoList;
import com.github.pagehelper.PageInfo;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface OrderService {
    /**
     * 将传入的商品购买信息生成预览订单，但不涉及数据库操作
     *
     * @param infoList 商品信息
     * @return map包含：total 实际总金额
     * activityList 活动
     */
    Map<String, Object> previewOrder(CommodityInfoList infoList);

    /**
     * 查找用户所有订单
     */
    List<Order> getAllUserOrder(String userId);

    /**
     * 查找用户对应状态的订单
     */
    PageInfo<Order> getUserOrder(String userId, int status, int current, int size);

    /**
     * 处理支付出现的异常
     *
     * @param e 异常
     */
    void payExceptionHandle(BaseException e);

    /**
     * 支付订单
     **/
    RetCode payOrder(List<String> orderIdList, String userId);

    /**
     * 直接购买确认订单，只有一个商品
     *
     * @param commodityId  商品id
     * @param addressId    收货地点id
     * @param commodityNum 商品购买数量
     * @param userId       用户id
     */
    Order confirmOrderFromCommodity(String commodityId, String addressId, int commodityNum, String moreInfo, String userId);

    List<Order> confirmOrderFromCart(List<String> cartItemIdList, String addressId, List<StoreMoreInfo> moreInfoList, String userId);

    RetCode quashOrder(String orderId, String userId);

    /**
     * 计算对应时间范围内商店的已完成订单销售额
     *
     * @param storeId   商店id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 销售额
     */
    Double storeSalesValue(String storeId, Date startTime, Date endTime);

    /**
     * 计算商店对应时间内已完成订单的商品销量
     *
     * @param storeId   商店id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 销量
     */
    int storeSalesVolume(String storeId, Date startTime, Date endTime);

    /**
     * 删除符合要求的订单，本质是更新标志位
     *
     * @param orderIdList 订单id
     * @param userId 请求用户
     */
    RetCode deleteOrder(List<String> orderIdList, String userId);

    /**
     * 订单收货
     * @param orderId 订单id
     * @param userId 请求用户
     */
    RetCode receiveOrder(String orderId, String userId);
}
